import {ObjectType} from '../../type';


// ======== Decorator Metadata type define ===============

/** metadata type */
export type MetadataType = 'class' | 'property' | 'method' | 'parameter';

/** metadata interface */
export interface IMetadata {
  metadataType: MetadataType
}

/**
 * 类元数据定义
 */
export interface ClassMetadata<T> extends IMetadata {
  /**
   * 类对象
   */
  clazz: ObjectType<T>;
  /**
   * 类名
   */
  className: string;
  /**
   * 修饰参数
   */
  options?: {[key: string]: any}
}

/**
 * 属性元数据定义
 */
export interface PropertyMetadata<T> extends IMetadata {
  /**
   * 属性所在类元数据
   */
  classMetadata: ClassMetadata<T>;
  /**
   * 属性名
   */
  name: string;
  /**
   * 属性类型
   */
  type: ObjectType<T>;
  /**
   * 修饰参数
   */
  options?: {[key: string]: any}
}

/**
 * 方法元数据定义
 */
export interface MethodMetadata<T> extends IMetadata {
  /**
   * 方法所在类元数据
   */
  classMetadata: ClassMetadata<T>;
  /**
   * 方法名
   */
  name: string;
  /**
   * 方法返回值类型
   */
  returnType: ObjectType<any>;
  /**
   * 修饰参数
   */
  options?: {[key: string]: any}
}

/**
 * 参数元数据定义
 */
export interface ParameterMetadata<T> extends IMetadata {
  /**
   * 方法所在类元数据
   */
  classMetadata: ClassMetadata<T>;
  /**
   * 参数所在方法元数据
   */
  methodMetadata: MethodMetadata<T>;
  /**
   * 参数名称
   */
  name?: string;
  /**
   * 参数索引(参数在方法的第几个位置)
   */
  index: number;
  /**
   * 参数类型
   */
  type: ObjectType<any>;
}
